package org.gap.service;

import java.util.List;
import java.util.Set;

import org.gap.dao.TiersRibDAO;
import org.gap.dao.UtilisateursDAO;

import org.gap.domain.TiersRib;
import org.gap.domain.Utilisateurs;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for TiersRib entities
 * 
 */

@Service("TiersRibService")
@Transactional
public class TiersRibServiceImpl implements TiersRibService {

	/**
	 * DAO injected by Spring that manages TiersRib entities
	 * 
	 */
	@Autowired
	private TiersRibDAO tiersRibDAO;

	/**
	 * DAO injected by Spring that manages Utilisateurs entities
	 * 
	 */
	@Autowired
	private UtilisateursDAO utilisateursDAO;

	/**
	 * Instantiates a new TiersRibServiceImpl.
	 *
	 */
	public TiersRibServiceImpl() {
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersRib saveTiersRibUtilisateursByTrbUserModification(Integer trbTiers, Integer trbRib, Utilisateurs related_utilisateursbytrbusermodification) {
		TiersRib tiersrib = tiersRibDAO.findTiersRibByPrimaryKey(trbTiers, trbRib, -1, -1);
		Utilisateurs existingutilisateursByTrbUserModification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbytrbusermodification.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByTrbUserModification != null) {
			existingutilisateursByTrbUserModification.setUsrUser(related_utilisateursbytrbusermodification.getUsrUser());
			existingutilisateursByTrbUserModification.setUsrPassword(related_utilisateursbytrbusermodification.getUsrPassword());
			existingutilisateursByTrbUserModification.setUsrService(related_utilisateursbytrbusermodification.getUsrService());
			existingutilisateursByTrbUserModification.setUsrMail(related_utilisateursbytrbusermodification.getUsrMail());
			existingutilisateursByTrbUserModification.setUsrEnabled(related_utilisateursbytrbusermodification.getUsrEnabled());
			related_utilisateursbytrbusermodification = existingutilisateursByTrbUserModification;
		} else {
			related_utilisateursbytrbusermodification = utilisateursDAO.store(related_utilisateursbytrbusermodification);
			utilisateursDAO.flush();
		}

		tiersrib.setUtilisateursByTrbUserModification(related_utilisateursbytrbusermodification);
		related_utilisateursbytrbusermodification.getTiersRibsForTrbUserModification().add(tiersrib);
		tiersrib = tiersRibDAO.store(tiersrib);
		tiersRibDAO.flush();

		related_utilisateursbytrbusermodification = utilisateursDAO.store(related_utilisateursbytrbusermodification);
		utilisateursDAO.flush();

		return tiersrib;
	}

	/**
	 * Return all TiersRib entity
	 * 
	 */
	@Transactional
	public List<TiersRib> findAllTiersRibs(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<TiersRib>(tiersRibDAO.findAllTiersRibs(startResult, maxRows));
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersRib saveTiersRibUtilisateursByTrbUserCreation(Integer trbTiers, Integer trbRib, Utilisateurs related_utilisateursbytrbusercreation) {
		TiersRib tiersrib = tiersRibDAO.findTiersRibByPrimaryKey(trbTiers, trbRib, -1, -1);
		Utilisateurs existingutilisateursByTrbUserCreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbytrbusercreation.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByTrbUserCreation != null) {
			existingutilisateursByTrbUserCreation.setUsrUser(related_utilisateursbytrbusercreation.getUsrUser());
			existingutilisateursByTrbUserCreation.setUsrPassword(related_utilisateursbytrbusercreation.getUsrPassword());
			existingutilisateursByTrbUserCreation.setUsrService(related_utilisateursbytrbusercreation.getUsrService());
			existingutilisateursByTrbUserCreation.setUsrMail(related_utilisateursbytrbusercreation.getUsrMail());
			existingutilisateursByTrbUserCreation.setUsrEnabled(related_utilisateursbytrbusercreation.getUsrEnabled());
			related_utilisateursbytrbusercreation = existingutilisateursByTrbUserCreation;
		} else {
			related_utilisateursbytrbusercreation = utilisateursDAO.store(related_utilisateursbytrbusercreation);
			utilisateursDAO.flush();
		}

		tiersrib.setUtilisateursByTrbUserCreation(related_utilisateursbytrbusercreation);
		related_utilisateursbytrbusercreation.getTiersRibsForTrbUserCreation().add(tiersrib);
		tiersrib = tiersRibDAO.store(tiersrib);
		tiersRibDAO.flush();

		related_utilisateursbytrbusercreation = utilisateursDAO.store(related_utilisateursbytrbusercreation);
		utilisateursDAO.flush();

		return tiersrib;
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersRib deleteTiersRibUtilisateursByTrbUserCreation(Integer tiersrib_trbTiers, Integer tiersrib_trbRib, String related_utilisateursbytrbusercreation_usrUser) {
		TiersRib tiersrib = tiersRibDAO.findTiersRibByPrimaryKey(tiersrib_trbTiers, tiersrib_trbRib, -1, -1);
		Utilisateurs related_utilisateursbytrbusercreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbytrbusercreation_usrUser, -1, -1);

		tiersrib.setUtilisateursByTrbUserCreation(null);
		related_utilisateursbytrbusercreation.getTiersRibsForTrbUserCreation().remove(tiersrib);
		tiersrib = tiersRibDAO.store(tiersrib);
		tiersRibDAO.flush();

		related_utilisateursbytrbusercreation = utilisateursDAO.store(related_utilisateursbytrbusercreation);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbytrbusercreation);
		utilisateursDAO.flush();

		return tiersrib;
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersRib deleteTiersRibUtilisateursByTrbUserModification(Integer tiersrib_trbTiers, Integer tiersrib_trbRib, String related_utilisateursbytrbusermodification_usrUser) {
		TiersRib tiersrib = tiersRibDAO.findTiersRibByPrimaryKey(tiersrib_trbTiers, tiersrib_trbRib, -1, -1);
		Utilisateurs related_utilisateursbytrbusermodification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbytrbusermodification_usrUser, -1, -1);

		tiersrib.setUtilisateursByTrbUserModification(null);
		related_utilisateursbytrbusermodification.getTiersRibsForTrbUserModification().remove(tiersrib);
		tiersrib = tiersRibDAO.store(tiersrib);
		tiersRibDAO.flush();

		related_utilisateursbytrbusermodification = utilisateursDAO.store(related_utilisateursbytrbusermodification);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbytrbusermodification);
		utilisateursDAO.flush();

		return tiersrib;
	}

	/**
	 * Delete an existing TiersRib entity
	 * 
	 */
	@Transactional
	public void deleteTiersRib(TiersRib tiersrib) {
		tiersRibDAO.remove(tiersrib);
		tiersRibDAO.flush();
	}

	/**
	 * Save an existing TiersRib entity
	 * 
	 */
	@Transactional
	public void saveTiersRib(TiersRib tiersrib) {
		TiersRib existingTiersRib = tiersRibDAO.findTiersRibByPrimaryKey(tiersrib.getTrbTiers(), tiersrib.getTrbRib());

		if (existingTiersRib != null) {
			if (existingTiersRib != tiersrib) {
				existingTiersRib.setTrbTiers(tiersrib.getTrbTiers());
				existingTiersRib.setTrbRib(tiersrib.getTrbRib());
				existingTiersRib.setTrbPays(tiersrib.getTrbPays());
				existingTiersRib.setTrbEtablissement(tiersrib.getTrbEtablissement());
				existingTiersRib.setTrbGuichet(tiersrib.getTrbGuichet());
				existingTiersRib.setTrbDenomGuichet(tiersrib.getTrbDenomGuichet());
				existingTiersRib.setTrbCompte(tiersrib.getTrbCompte());
				existingTiersRib.setTrbCleRib(tiersrib.getTrbCleRib());
				existingTiersRib.setTrbGuichetDom(tiersrib.getTrbGuichetDom());
				existingTiersRib.setTrbDenomDom(tiersrib.getTrbDenomDom());
				existingTiersRib.setTrbTitulaire(tiersrib.getTrbTitulaire());
				existingTiersRib.setTrbRibValide(tiersrib.getTrbRibValide());
				existingTiersRib.setTrbIban(tiersrib.getTrbIban());
				existingTiersRib.setTrbBic(tiersrib.getTrbBic());
				existingTiersRib.setTrbDateCreation(tiersrib.getTrbDateCreation());
				existingTiersRib.setTrbDateModification(tiersrib.getTrbDateModification());
			}
			tiersrib = tiersRibDAO.store(existingTiersRib);
		} else {
			tiersrib = tiersRibDAO.store(tiersrib);
		}
		tiersRibDAO.flush();
	}

	/**
	 * Load an existing TiersRib entity
	 * 
	 */
	@Transactional
	public Set<TiersRib> loadTiersRibs() {
		return tiersRibDAO.findAllTiersRibs();
	}

	/**
	 * Return a count of all TiersRib entity
	 * 
	 */
	@Transactional
	public Integer countTiersRibs() {
		return ((Long) tiersRibDAO.createQuerySingleResult("select count(*) from TiersRib o").getSingleResult()).intValue();
	}

	/**
	 */
	@Transactional
	public TiersRib findTiersRibByPrimaryKey(Integer trbTiers, Integer trbRib) {
		return tiersRibDAO.findTiersRibByPrimaryKey(trbTiers, trbRib);
	}
}
